/*
 * MUsuarios.java
 *
 * Created on 16 de mayo de 2006, 12:46 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ig.metrica.ui.seguridad;

import ejb.metrica.seguridad.control.CuentaUsuarioControlBean;
import ejb.metrica.seguridad.control.LoginDTO;
import ejb.metrica.seguridad.entity.BusquedaDTO;
import ejb.metrica.seguridad.entity.CuentausuarioDTO;
import ejb.metrica.seguridad.entity.HistoriacuentasDTO;
import ejb.metrica.seguridad.entity.RolesDTO;
import ejb.metrica.seguridad.entity.UsuarioDTO;
import ig.metrica.ui.PrincipalMetrica;
import ig.metrica.ui.ServiceLocator;
import ig.metrica.ui.interfaces.comunes.IModelo;
import ig.metrica.ui.pantallas.comunes.ManipulacionDatos;
import ig.util.CodigoBotones;
import ig.util.Digest;
import ig.util.NoContinuaException;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author jsanchez
 */
public class MUsuarios implements IModelo{
    PUsuarios panel=null;
    BusquedaDTO busquedaDTO=null;
    Boolean inicio=null;
    LoginDTO login= new LoginDTO();
    /** Creates a new instance of MUsuarios */
    public MUsuarios(PUsuarios panel) { 
        this.panel=panel;
        setLogin();
    }
    private void setLogin(){
        ((PrincipalMetrica)this.panel.getFrame()).setLogin(this.login);
    }
    
    public void setBusquedaDTO(BusquedaDTO busquedaDTO) {
        this.busquedaDTO = busquedaDTO;        
        //System.out.println(busquedaDTO);
    }

    public BusquedaDTO getBusquedaDTO() {
        return busquedaDTO;
    }

    public void guardar() throws NoContinuaException {
       // System.out.println(this.panel.getOperacion()+"::"+CBuscar);
        try {
            if(this.panel.getOperacion().equals("MODIFICADO")){
                Boolean res=this.lookupCuentaUsuarioControlBean().modificar(CBuscar);
                if(res!=null && !res)
                    throw new NoContinuaException("No se pudo Guardar los cambios");
                else if(res==null)
                    throw new NoContinuaException("Ya existe una cuenta con el mismo Usuario.");                
            }else if(this.panel.getOperacion().equals("NUEVO")){
                this.CBuscar.add(this.cuentausuarioDTO);
                this.CBuscar.add(this.usuarioDTO);
                this.CBuscar.add(this.rolesDTO);
                //System.out.println("CBuscar:"+CBuscar);
                Integer res =this.lookupCuentaUsuarioControlBean().crear(CBuscar);
                if(res==null)                
                   throw new NoContinuaException("No se pudo Guardar los cambios");
                else if(res==-1)
                   throw new NoContinuaException("Ya existe una cuenta con el mismo Usuario.");
                this.buscar(res);
                inicio=false;
            }
        } catch (RemoteException ex) {
            throw new NoContinuaException("No se pudo Guardar los cambios"+ex.getMessage());            
        }
    }

    public Collection buscar() throws NoContinuaException {
        busquedaDTO=null;
        DBuscar dBuscar= new DBuscar(this); 
        if(this.getBusquedaDTO()!=null){
            this.buscar(getBusquedaDTO().getId());
            inicio=false;
        }
        return null;
    }

    public void modificar() throws NoContinuaException {
    }
    Boolean nuevo=null;
    
    public Boolean getNuevoUsuario() {
        return nuevo;
    }
    public void setNuevoUsuario(Boolean nuevo) {
        this.nuevo = nuevo;
    }

    public void nuevo() throws NoContinuaException {
        String Key=((PrincipalMetrica)this.panel.getFrame()).getUser();
        Long ID=(Long) ((PrincipalMetrica)this.panel.getFrame()).getSession().get(Key);

        if(inicio!=null && !inicio){
            new DNuevaCuentaOrUsuario(this,this.getRootPanel(),true);
        }else
            this.setNuevoUsuario(true);
        if(this.getNuevoUsuario()==null){            
            return ;//this.panel.cancelar();
        }else if(this.getNuevoUsuario()){
            this.inicio=true;
            usuarioDTO=new UsuarioDTO();            
            usuarioDTO.setID(ID);
            usuarioDTO.setUSUARIO(Key);
        
            cuentausuarioDTO=new CuentausuarioDTO();
            rolesDTO=new RolesDTO();
            rolesDTO.setID(ID);
            rolesDTO.setUSUARIO(Key);            
            CHistoriacuentasDTO=null;
            CRolesDTO =null;
            this.CBuscar=new ArrayList();    
            try {
                this.CRolesDTO=this.lookupCuentaUsuarioControlBean().findAllRoles(login);
                panel.updateData();
                panel.cleanTable();
            } catch (RemoteException ex) {
                throw new NoContinuaException(ex.getMessage());            
            }
        }else if(!this.getNuevoUsuario()){
            cuentausuarioDTO=new CuentausuarioDTO();
            cuentausuarioDTO.setID(ID);
            cuentausuarioDTO.setUSUARIO(Key);
            
            rolesDTO=new RolesDTO();
            rolesDTO.setID(ID);
            rolesDTO.setUSUARIO(Key);            
            
            CHistoriacuentasDTO=null;
            CRolesDTO =null;
            //this.CBuscar=new ArrayList();    
            try {
                this.CRolesDTO=this.lookupCuentaUsuarioControlBean().findAllRoles(login);
                panel.updateData();
                panel.cleanTable();
            } catch (RemoteException ex) {
                throw new NoContinuaException(ex.getMessage());            
            }            
        }        
    }
    
    String opcion=null;
    public void setOpcionEliminar(String opcion){
        this.opcion=opcion;
    }

    public String getOpcion() {
        return opcion;
    }

    public void eliminar() throws NoContinuaException {
        this.opcion=null;        
        new CorfimacionEliminar(this.getRootPanel(),true,this);
        try {
            if(opcion!=null){
                if(opcion.equals("cuenta")){
                    this.lookupCuentaUsuarioControlBean().eliminarCuenta(this.cuentausuarioDTO.getId(),login);
                }else if(opcion.equals("usuario")){
                    this.lookupCuentaUsuarioControlBean().eliminarUsuario(this.cuentausuarioDTO.getId(),login);
                }
                this.inicio=null;
            }
        } catch (RemoteException ex) {
            throw new NoContinuaException(ex.getMessage());
        }
    }

    public void salir() throws NoContinuaException {
    }

    public void imprimir() throws NoContinuaException {
    }

    public Object getTO() throws NoContinuaException {
        return null;
    }

    public void cancelar() throws NoContinuaException {
        panel.cancelar();
        this.opcion=null;        
    }
    public JPanel getPanel(){
        return panel;
    }

    public JFrame getRootPanel() {
       return  panel.getFrame();
    }
    UsuarioDTO usuarioDTO=null;
    CuentausuarioDTO cuentausuarioDTO=null;
    RolesDTO rolesDTO=null;
    
    Collection CHistoriacuentasDTO =null;
    Collection CRolesDTO =null;
    
    void buscar(Integer integer) throws NoContinuaException {
        usuarioDTO=null;cuentausuarioDTO=null;
        CHistoriacuentasDTO=null;CRolesDTO =null;        

        try {            
            this.setVariables(this.lookupCuentaUsuarioControlBean().findAllByPrimaruKey(integer,login));
            //this.setVariables(this.lookupCuentaUsuarioControlBean().findHistoriasByIdUsuario(integer));
            this.panel.setOperacion(null);
            panel.updateData();
        } catch (RemoteException ex) {
            ex.printStackTrace();
        }
    }
    Collection CBuscar=null;

    private void setVariables(Collection CBuscar){
            this.CBuscar=CBuscar;
            for (Object elem : CBuscar) {                
                /////
                if(elem instanceof LoginDTO){
                    String Key=((PrincipalMetrica)this.panel.getFrame()).getUser();
                    Long ID=(Long) ((PrincipalMetrica)this.panel.getFrame()).getSession().get(Key);
                    //System.out.println("ID:"+ID);
                    //Firmando todos los objetos que llegan
                    ((LoginDTO)elem).setID(ID);
                    ((LoginDTO)elem).setUSUARIO(Key);
                    ///////
                    login.setID(ID);
                    login.setUSUARIO(Key);
                }
                if(elem instanceof UsuarioDTO)
                    this.usuarioDTO=(UsuarioDTO) elem;
                else if(elem instanceof CuentausuarioDTO)
                    this.cuentausuarioDTO=(CuentausuarioDTO) elem;
                else if(elem instanceof RolesDTO)
                    this.rolesDTO=(RolesDTO) elem;
                else if(elem instanceof Collection){
                    if(((Collection)elem)!=null && ((Collection)elem).size()>0){
                        if(((Collection)elem).toArray()[0] instanceof HistoriacuentasDTO){
                            this.CHistoriacuentasDTO=(Collection) elem;
                        }else if(((Collection)elem).toArray()[0] instanceof RolesDTO){
                            this.CRolesDTO=(Collection) elem;
                        }
                    }                                                                 
                }
            }        
    }
    public Object[][] getHistoriacuentasData(){
        if(CHistoriacuentasDTO!=null){
            Object[][] Data= new Object[this.CHistoriacuentasDTO.size()][4];    
            int i=0;            
            for (Object elem : this.CHistoriacuentasDTO) {
                Data[i][0]=((HistoriacuentasDTO)elem ).getId();
                Data[i][1]=((HistoriacuentasDTO)elem ).getCuentaanterior();
                Data[i][2]=((HistoriacuentasDTO)elem ).getFechacreacion();
                Data[i][3]=((HistoriacuentasDTO)elem ).getUsuariocreo();
                i++;
            }
            return Data;
         }
         return null;
    }
    public RolesDTO getRolesDTO() {
        return rolesDTO;
    }

    public UsuarioDTO getUsuarioDTO() {
        return usuarioDTO;
    }

    public Collection getHistoriacuentasDTO() {
        return CHistoriacuentasDTO;
    }

    public CuentausuarioDTO getCuentausuarioDTO() {
        return cuentausuarioDTO;
    }

    public Collection getCRolesDTO() {
        return CRolesDTO;
    }

     private ServiceLocator serviceLocator;
     private ServiceLocator getServiceLocator() {
        if (serviceLocator == null) {
            serviceLocator = new ServiceLocator();
        }
        return serviceLocator;
    }
     
   public ejb.metrica.seguridad.control.CuentaUsuarioControlBean lookupCuentaUsuarioControlBean() throws NoContinuaException, RemoteException {
        
       return new CuentaUsuarioControlBean();
       /*try {
            return ((ejb.metrica.seguridad.control.CuentaUsuarioControlRemoteHome) getServiceLocator().getRemoteHome("CuentaUsuarioControlBean",ejb.metrica.seguridad.control.CuentaUsuarioControlRemoteHome.class)).create();
        } catch(javax.naming.NamingException ne) {
            //java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
            throw new NoContinuaException("No hay conexi\u00F3n con el Servidor");
            //throw new RuntimeException(ne);
        } catch(javax.ejb.CreateException ce) {
            //java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ce);
            throw new NoContinuaException("No hay conexi\u00F3n con el Servidor");
            //throw new RuntimeException(ce);
        } catch(java.rmi.RemoteException re) {
            //java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,re);
            throw new NoContinuaException("No hay conexi\u00F3n con el Servidor");
            //throw new RuntimeException(re);
        }*/
   }    

    void setEstado() {
        if(this.CBuscar==null || this.CBuscar.size()==0)
            ((ManipulacionDatos)panel.getInternalFrame()).setEstado(CodigoBotones.grupoEntrada);
        else
            ((ManipulacionDatos)panel.getInternalFrame()).setEstado(CodigoBotones.grupoEntrada+CodigoBotones.modificar+CodigoBotones.eliminar);
    }

    public String getPassword(char[] psw1,char[] psw2,char[] psw3) throws NoContinuaException {
        String CADENA1=this.getCadena(psw1);
        String CADENA2=this.getCadena(psw2);
        String CADENA3=this.getCadena(psw3);        
        if(Digest.encriptar(CADENA1).equals(this.cuentausuarioDTO.getCuenta())){
            if(!Digest.encriptar(CADENA2).equals(Digest.encriptar(CADENA3)))
                throw new NoContinuaException("Error al reescribir la clave");
        }else
            throw new NoContinuaException("Clave antigua incorrecta");        
        return Digest.encriptar(CADENA2);        
    }
    
    public String getPassword(char[] psw1,char[] psw2) throws NoContinuaException {
        String CADENA1=this.getCadena(psw1);
        String CADENA2=this.getCadena(psw2);
        if(!Digest.encriptar(CADENA2).equals(Digest.encriptar(CADENA1)))
            throw new NoContinuaException("La Clave nueva con es la misma reescrita");
        return Digest.encriptar(CADENA1);        
    }
    
    
   public Integer getIdRolesDTO(String string){
       for (Object elem : CRolesDTO) {
           if(((RolesDTO)elem).getNombre().trim().equals(string.trim())){
               return ((RolesDTO)elem).getId();
           }
       }
       return null;
   }

    private String getCadena(char[] psw1) {        
        String PASSWORD="";
        for (int i = 0; i < psw1.length; i++) {
            PASSWORD=PASSWORD+psw1[i];
        }        
        return PASSWORD.trim();
    }

    LoginDTO getLogin() {
        //System.out.println("login:"+login.getID()+"-"+login.getUSUARIO());
        return this.login;
    }
}
